package commons.utils;

import commons.logs.Logger;
import java.util.HashMap;


public class UtilsTime {

	//**************************************************************************
	//     TIMER STANDARD
	//**************************************************************************

	static private HashMap<String, Long> mapTimer;

	public static void startTimer (String name) {
		long deb = System.nanoTime();
		if (mapTimer==null) mapTimer = new HashMap<String, Long>();
//		if (mapTimer.containsKey(name))
//			mapTimer.remove(name);
		mapTimer.put(name, deb);
	}
	public static void stopTimer (String name) {
		long fin = System.nanoTime();
		if (mapTimer==null || (!mapTimer.containsKey(name)) ) {
			assert(false) : "ERREUR TIMER : " + name + " n'a jamais été démarré !!!!!!!!!!!";
			return;
		}
		long deb = mapTimer.get(name);
		long duree = fin-deb;

		// On met en négatif pour indiquer que le timer a bien été arreté
		//  et que la valeur stockée n'est plus le tick de début ...
		mapTimer.put(name, -duree);
	}
	public static String getStringDuree (String name) {
		if (mapTimer==null || (!mapTimer.containsKey(name)) ) {
			assert(false) : "ERREUR TIMER : " + name + " n'a jamais été démarré !!!!!!!!!!!";
			return "";
		}
		long dureeMs = mapTimer.get(name);
		if ( dureeMs > 0) {
			assert(false) : "ERREUR TIMER : " + name + " n'a jamais été arrêté !!!!!!!!!!!";
			return "";
		}
		return "->Durée " + name + " : " + UtilsCalcul.round ( (double)(-dureeMs)/1000000000.0 , 2);
	}
	public static double getDuree (String name) {
		if (mapTimer==null || (!mapTimer.containsKey(name)) ) {
			assert(false) : "ERREUR TIMER : " + name + " n'a jamais été démarré !!!!!!!!!!!";
			return -1;
		}
		long dureeMs = mapTimer.get(name);
		if ( dureeMs > 0) {
			assert(false) : "ERREUR TIMER : " + name + " n'a jamais été arrêté !!!!!!!!!!!";
			return -1;
		}
		return UtilsCalcul.round ( (double)(-dureeMs)/1000000000.0 , 2);
	}

	//**************************************************************************
	//     TIMER MOYENNE (un seul pour toute l'application (l'affichage en fait)
	//        utilisé uniquement en mode DEBUG
	//**************************************************************************
	private static int compteur;
	private static long[] tabDuree;
	private static long deb_moyenne;

	public static void initTimerMoyenne(int tailleBuffer) {
		tabDuree = new long[tailleBuffer];
		compteur = 0;
	}

	public static void startTimerMoyenne() {
		if (!Logger.isDebugLevel())
			return;
		deb_moyenne = System.nanoTime();
	}
	public static void stopTimerMoyenne() {
		if (!Logger.isDebugLevel())
			return;
		
		long fin = System.nanoTime();
		long duree = fin-deb_moyenne;
		tabDuree[compteur] = duree;
		compteur++;

		if (compteur == tabDuree.length) {
			// on arrive au bout du bbuffer -> on calcule la moyenne
			double moyenne = 0;
			for (int i = 0; i <tabDuree.length; i++)
				moyenne += tabDuree[i];
			moyenne = moyenne / tabDuree.length;
			Logger.log_DEBUG1("Durée moyenne " + UtilsCalcul.round ( (double)(moyenne)/1000000000.0 , 2));
			compteur = 0;
		}
	}
}
